#include "key4x4.h"
//#include "delay1.h"
#include "FreeRTOS.h"
#include "task.h"

// void KEY_Config(void)
// {
//     GPIO_InitTypeDef  GPIO_InitStruct;
//     // 1》打开时钟----GPIOA
//     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

//     // 2》初始化GPIOA0
//     GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
//     GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
//     GPIO_Init(GPIOA, &GPIO_InitStruct);
// }

void MAT_KEY_Config(void)
{
    GPIO_InitTypeDef  GPIOA_InitStruct;
    GPIO_InitTypeDef  GPIOC_InitStruct;

    GPIO_InitTypeDef  GPIOB_InitStruct;
    GPIO_InitTypeDef  GPIOD_InitStruct;
    // 1》打开时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD | RCC_APB2Periph_AFIO, ENABLE);
    
    GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);

    // 2》初始化GPIOA0
    GPIOA_InitStruct.GPIO_Pin = GPIO_Pin_15;
    GPIOA_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_Init(GPIOA, &GPIOA_InitStruct);
    GPIOC_InitStruct.GPIO_Pin = (GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12);
    GPIOC_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_Init(GPIOC, &GPIOC_InitStruct);

    GPIOB_InitStruct.GPIO_Pin = (GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5);
    GPIOB_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIOB_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIOB_InitStruct);

    GPIOD_InitStruct.GPIO_Pin = GPIO_Pin_2;
    GPIOD_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIOB_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOD, &GPIOD_InitStruct);
}

//返回ret
uint8_t MAT_KEY_is_press(void)
{
    uint8_t ret = 99;
    GPIO_SetBits(GPIOB, GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5);
    GPIO_ResetBits(GPIOD, GPIO_Pin_2);
    // 判断是否有按键按下----判断PA15是否为0
    if (0 == GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_15))
    {
        // 是：延时30ms跳过抖动
       vTaskDelay(pdMS_TO_TICKS(80));

        // 再次判断PA15是否为0----判断是在按下过程中还是已经进入抬起
        if (0 == GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_15))
        {
            // 是：等待按键抬起
            while (0 == GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_15));
            // 执行相应的操作
            return ret = KEY_D;
        }
    }
    else if (0 == GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_10))
    {
        /* '#' */
        vTaskDelay(pdMS_TO_TICKS(80));
        if (0 == GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_10))
        {
            while (0 == GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_10));
            return ret = KEY_j;
        }
    }
    else if (0 == GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_11))
    {
        vTaskDelay(pdMS_TO_TICKS(80));
        if (0 == GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_11))
        {
            while (0 == GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_11));
            return ret = KEY_0;
        }
    }
    else if (0 == GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_12))
    {
        /* '*' */
        vTaskDelay(pdMS_TO_TICKS(80));
        if (0 == GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_12))
        {
            while (0 == GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_12));
            return ret = KEY_x;
        }
    }
    GPIO_SetBits(GPIOB, GPIO_Pin_4 | GPIO_Pin_5);
    GPIO_SetBits(GPIOD, GPIO_Pin_2);
    GPIO_ResetBits(GPIOB, GPIO_Pin_3);
    if (0 == GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_15))
    {
        vTaskDelay(pdMS_TO_TICKS(80));
        if (0 == GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_15))
        {
            while (0 == GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_15));
            return ret = KEY_C;
        }
    }
    else if (0 == GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_10))
    {
        vTaskDelay(pdMS_TO_TICKS(80));
        if (0 == GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_10))
        {
            while (0 == GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_10));
            return ret = KEY_9;
        }
    }
    else if (0 == GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_11))
    {
        vTaskDelay(pdMS_TO_TICKS(80));
        if (0 == GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_11))
        {
            while (0 == GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_11));
            return ret = KEY_8;
        }
    }
    else if (0 == GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_12))
    {
        vTaskDelay(pdMS_TO_TICKS(80));
        if (0 == GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_12))
        {
            while (0 == GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_12));
            return ret = KEY_7;
        }
    }
    GPIO_SetBits(GPIOB, GPIO_Pin_3 | GPIO_Pin_5);
    GPIO_SetBits(GPIOD, GPIO_Pin_2);
    GPIO_ResetBits(GPIOB, GPIO_Pin_4);
    if (0 == GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_15))
    {
        vTaskDelay(pdMS_TO_TICKS(80));
        if (0 == GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_15))
        {
            while (0 == GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_15));
            return ret = KEY_B;
        }
    }
    else if (0 == GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_10))
    {
        vTaskDelay(pdMS_TO_TICKS(80));
        if (0 == GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_10))
        {
            while (0 == GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_10));
            return ret = KEY_6;
        }
    }
    else if (0 == GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_11))
    {
        vTaskDelay(pdMS_TO_TICKS(80));
        if (0 == GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_11))
        {
            while (0 == GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_11));
            return ret = KEY_5;
        }
    }
    else if (0 == GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_12))
    {
        vTaskDelay(pdMS_TO_TICKS(80));
        if (0 == GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_12))
        {
            while (0 == GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_12));
            return ret = KEY_4;
        }
    }
    GPIO_SetBits(GPIOB, GPIO_Pin_4 | GPIO_Pin_3);
    GPIO_SetBits(GPIOD, GPIO_Pin_2);
    GPIO_ResetBits(GPIOB, GPIO_Pin_5);
    if (0 == GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_15))
    {
        vTaskDelay(pdMS_TO_TICKS(80));
        if (0 == GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_15))
        {
            while (0 == GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_15));
            return ret = KEY_A;
        }
    }
    else if (0 == GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_10))
    {
        vTaskDelay(pdMS_TO_TICKS(80));
        if (0 == GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_10))
        {
            while (0 == GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_10));
            return ret = KEY_3;
        }
    }
    else if (0 == GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_11))
    {
        vTaskDelay(pdMS_TO_TICKS(80));
        if (0 == GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_11))
        {
            while (0 == GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_11));
            return ret = KEY_2;
        }
    }
    else if (0 == GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_12))
    {
			vTaskDelay(pdMS_TO_TICKS(80));
			if (0 == GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_12))
        {
            while (0 == GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_12));
            return ret = KEY_1;
        }
    }

    return ret;
}

// uint8_t KEY_is_press(void)
// {
//     uint8_t ret = 0;
//     // 判断是否有按键按下----判断PA0是否为0
//     if (0 == GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0))
//     {
//         // 是：延时30ms跳过抖动
//         delay_ms(10);
//         // 再次判断PA0是否为0----判断是在按下过程中还是已经进入抬起
//         if (0 == GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0))
//         {
//             // 是：等待按键抬起
//             while (0 == GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0));
//             // 执行相应的操作
//             ret = 1;
//         }
//     }
//     return ret;
// }

